//
//  CZHomeViewController.swift
//  微博08
//
//  Created by apple on 16/2/26.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit
//框架刷新下拉数据

// 7-10创建下拉刷新提示view
// 7-11添加下拉刷新的提示view


import SVPullToRefresh
//在 CZHomeTableViewController.swift 文件 import SVPullToRefresh

class CZHomeViewController: CZBaseTableViewController {
    private let PullDownHeight=44
    // MARK: - 属性
    private let reuseIdentifier = "cellId"
    
    // 存储性属性
    var statuses: [CZStatus]? {
        didSet {
            // 当别人给statuses属性赋值后,再刷新tableView
            tableView.reloadData()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 只有用户登录了才需要做下面的操作
        if !CZUserAccountViewModel.sharedInstance.userLogin {
            return
        }

        setupNavigationBar()
        // 7-6-2 调用代码
        prepaerTableView()
        
        //loadStatus()
        //第七天上拉下来刷新数据refreshControl7-1
        // 打印查看是否有值
        //创建一个refreshControl
//        refreshControl=UIRefreshControl() //会有菊花旋转不会停下来
//         let view = UIView()
//        view.frame = CGRect(origin: CGPointZero, size: CGSize(width: 100, height: 50))
//        view.backgroundColor =  UIColor.redColor()
//        refreshControl?.addSubview(view)
//        //设置菊花清楚
//        refreshControl?.tintColor=UIColor.clearColor()//看不到菊花
           //7-2自己创建一个UIview设置属性CycRefreshContro控制器自定义下拉刷新控件
        
   // print( "refreshControl:\( refreshControl)")
        //refreshControl:nil打印结果是nil
    }
        //7-6抽取代码
        private func prepaerTableView()  {
          
            // 注册cell
            tableView.registerClass(CZStatusCell.self, forCellReuseIdentifier: reuseIdentifier)
            
            /*
            tableView cell的高度根据内容自适应
            1.设置预估行高
            2.设置rowHeight = UITableViewAutomaticDimension
            3.设置好约束.contentView
            */
            tableView.estimatedRowHeight = 150
            tableView.rowHeight = UITableViewAutomaticDimension
            //发现问题加载数据一致在旋转
            // 解决问题是创建一个方法
            //设置刷新新控件
            refreshControl=CycNewRefreshctrol()
            //7-6-2
            refreshControl?.addTarget(self, action: "loadNewStatus", forControlEvents: UIControlEvents.ValueChanged)
            //unrecognized selector sent to instance 0x7fb976140530出现这个问题是因没有这方法方法
            //7-6--5
           // 开始刷新beginRefreshing()开始刷新状态并不会触发UIControlEvents.ValueChanged事件
            refreshControl?.beginRefreshing()
            //我们主动触发refreshControl的UIControlEvents.ValueChanged事件
            //7-6-6已经完成刷新新控件
            refreshControl?.sendActionsForControlEvents(UIControlEvents.ValueChanged)
            //7-8
            //SVPullToRefresh 中 上拉加载更多 控件相关函数
            //func addInfiniteScrollingWithActionHandler(actionHandler: (() -> Void)!) 添加 上拉加载更多控件 事件, 注意: 如果没有添加 上拉加载更多控件 事件, 上拉加载更多控件是不会显示出来的.
            //上拉加载更多
            tableView.addInfiniteScrollingWithActionHandler { () -> Void in
                print("上拉吗？")
            self.loadMoreStatus()
            }
            
         }
         //这里要修改不能私有private
    /**
    加载最新微博数据,调用场景:1.一进入程序 2.用户用手拖动下拉刷新
    */
      func loadNewStatus()  {
                //2.调用Status的loadStatus加载数据准备闭包
                // 当statuses有值的时候,获取到微博id最大的这条,整个微博数组的第一条就是id最大的微博
                let since_id = statuses?.first?.id ?? 0

        statusVM.loadStatus(since_id, max_id: 0) { (statuses, error) -> () in
            //7-6让刷新控件回到没有加载的状态
            self.refreshControl?.endRefreshing()
            //7-7 判断错误
            if error != nil {
                print("加载微博数据出错了: \(error)")
                
                return
            }
            let count = statuses?.count ?? 0
            print("加载到的微博数据: \(count)")
            // 7-10-2
            //调用下拉view方法label
            // 判断是否是下拉刷新数据
            if since_id > 0 {
            self.showPUllDownTipView(count)
            }
            if count == 0 {
                return
            }
        // 15.之前没有微博数据
            if since_id==0{
                self.statuses=statuses
                
            }else{
                // 之前有微博数据,将加载到的新微博数据拼接到现有数据的前面
                self.statuses = statuses! + self.statuses!

            }
            //07.下拉刷新
            // 没有出错
              print("最终的微博数据: \(self.statuses?.count)")
//            print("在控制器中打印微博数据: \(statuses)")
//            self.statuses = statuses
//            Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[微博cyc.CZHomeViewController loadStatus]: unrecognized selector sent to instance 0x7fb30e097e20'
//            *** First throw call stack:
            // refreshControl?.addTarget(self, action: "loadNewStatus", forControlEvents: UIControlEvents.ValueChanged)
            //loadNewStatus修改成这个方法名
            // OC使用
//            self.tableView.reloadData()
        }
    }
    //7-10
    /**
    7-10下拉刷新数据view
    count微博数据
    */
    private func showPUllDownTipView(count:Int){
        //let label=UILabel(textColor: UIColor.whiteColor(), font: 16)
        //修改frame值
        
//        label.frame=CGRect(origin: CGPointZero, size: CGSize(width: UIScreen.width, height: 44))
        
        
    //7-11-2
        //动画下拉添加下拉提示已经完成了
        pullDownTipLabel.text = count == 0 ? "没有获得新的微博数据":"更新\(count)条刷新数据"

        let duration = 1
        UIView.animateWithDuration(1, animations: { () -> Void in
            // UIView翻转动画让动画反过来执行
            //UIView.setAnimationRepeatAutoreverses(true)
            //UIView.setAnimationRepeatCount(5)
            
         self.pullDownTipLabel.frame.origin.y = 44
            }) { (_) -> Void in
                //停一段时间在动画回去
                UIView.animateWithDuration(1, delay: 0.5, options: UIViewAnimationOptions(rawValue: 0), animations: { () -> Void in
                     self.pullDownTipLabel.frame.origin.y = -44 - 20
                    }, completion: { (_) -> Void in
                        // 移除
                       // self.pullDownTipLabel self.pullDownTipLabel.removeFromSuperview()
                        print("动画真的结束了")
                })
                print(" 动画完成了")
        }
    }
    
    
    
    /**
     7-8
     上拉加载更多数据
     
     */
    //实现 loadMoreStatus 方法:
    func loadMoreStatus(){
        //请求 获取所有微博数据中id最小额微博
          let max_id = statuses?.last?.id ?? 0
         statusVM.loadStatus(0, max_id: max_id) { (statuses, error) -> () in
            // 停止上拉加载数据动画
            //self.tableView.infiniteScrollingView.stopAnimating()
            if error != nil{
                print("加载微博数据出错了")
                return
            }
            // 加载更多微博数据成功
              let count=statuses?.count ?? 0
            if count==0{
                print(" 上拉加载没有获取更多微博数据")
                return
            }
            // 上拉加载数据成功
            // 在之前有微博数据将加载的微博数据拼接大搜啊现有数据的面
            
            self.statuses = self.statuses! + statuses!
        }
        print("最终的微博数据:\(self.statuses?.count)")
        
        }
    
    
    
    /**
     设置导航栏
     */
    private func setupNavigationBar() {
        setupBarButtonItem()
        setupTitleView()
    }
    
    /**
     设置导航栏左右item
     */
    private func setupBarButtonItem() {
        // 方式4
        navigationItem.leftBarButtonItem = UIBarButtonItem(imageName: "navigationbar_friendsearch")
        navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: "navigationbar_pop")
    }
    
    private func setupTitleView() {
        // 创建按钮
        let titleButton = CZTitleView(title: "我是翠翠")
        
        // 添加点击事件
        titleButton.addTarget(self, action: "titleButtonClick:", forControlEvents: UIControlEvents.TouchUpInside)
        
        navigationItem.titleView = titleButton
    }
    
    // MARK: - 按钮点击事件
    func titleButtonClick(button: UIButton) {
        // 根据按钮的selected来确定按钮旋转的角度
        // selected = false, 箭头向下
        // selected = true, 箭头向上
        
        button.selected = !button.selected
        
        UIView.animateWithDuration(0.25) { () -> Void in
            button.imageView?.transform = button.selected ? CGAffineTransformMakeRotation(CGFloat(M_PI - 0.001)) : CGAffineTransformIdentity
        }
        
        // 按钮选中的时候弹出Popover
        if button.selected {
            // UIpopoverViewController: 只能用在iPad上面
            // iOS8.0以后,使用 UIPopoverPresentationController 可以达到popover的效果
            
            // 1.加载sb
            let sb = UIStoryboard(name: "Popover", bundle: nil)
            
            // 2.创建控制器
            let popoverVC = sb.instantiateViewControllerWithIdentifier("popover")
            
            // 在iPhone上面设置Popover默认会适配成Modal
            popoverVC.modalPresentationStyle = UIModalPresentationStyle.Popover

            // 设置popoverPresentationController代理
            popoverVC.popoverPresentationController?.delegate = self
            popoverVC.popoverPresentationController?.sourceView = navigationItem.titleView
            popoverVC.popoverPresentationController?.sourceRect = navigationItem.titleView!.bounds
            
            // 设置弹出控制器显示的大小
            popoverVC.preferredContentSize = CGSize(width: 200, height: 5 * 44)
            
            presentViewController(popoverVC, animated: true, completion: nil)
        }
    }
    
    
    // MARK: - 懒加载
    /// 微博模型的ViewModel
    private lazy var statusVM: CZStatusViewModel = CZStatusViewModel()
    /// 7-12-1下拉刷新的提示view
    private lazy var pullDownTipLabel:UILabel = {
        let label = UILabel(textColor: UIColor.whiteColor(), font: 16)
        label.frame=CGRect(origin: CGPoint(x: 0, y: -44 - 20), size: CGSize(width: UIScreen.width, height: 44))
        //设置文本
        label.textAlignment=NSTextAlignment.Center
        label.backgroundColor=UIColor.orangeColor()
        //7-10-2-3
        //修改判断有没有加载数据
        
               // 添加当前的view里
        //7-11self.view 是什么类型需要看控制器 tableviewcontroller.self.view就是 tableview
        
        //self.view.addSubview(label)
      self.navigationController?.navigationBar.insertSubview(label, atIndex: 0)
        
        return label
    }()
}

// MARK: - tableView相关
extension CZHomeViewController {
    // 显示多少个cell
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // ??: ?? 前面的可选有值,就拆包,如果没有值,使用 ?? 后面的值
        return statuses?.count ?? 0
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier, forIndexPath: indexPath) as! CZStatusCell
        
        // 将微博的内容显示出来
        // statuses?也能赋值,看接收方的类型
        cell.status = statuses?[indexPath.row]
        
        return cell
    }
    //到这里为止,原创没有图片的微博已经完成了
    override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        return false
    }
}

extension CZHomeViewController: UIPopoverPresentationControllerDelegate {
    // 让iPhone上面可以显示popover效果
    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.None
    }
    
    // popover关闭时调用
    func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController) {
        // 将标题按钮的箭头转下去
        let button = navigationItem.titleView as! CZTitleView
        titleButtonClick(button)
    }
}
//7-6-6已经完成刷新新控件


//7-7下拉刷新完成
//7-12 懒加载提示view完成 方法的抽取
//7-13 新浪字符串NSDate